package top.IT00544.utils;

import org.apache.commons.lang.StringUtils;
import org.mozilla.universalchardet.UniversalDetector;

import java.io.*;

/**
 * file工具类
 */
public class FileUtil {

    /**
     * 获得文件编码格式 法二
     *
     * java获得文件编码格式
     * https://blog.csdn.net/xiao1122/article/details/105288946
     * 本文主要通过google开源的 juniversalchardet 来实现
     * @param fileName
     * @return
     * @throws IOException
     */
    public static String getFileCharset(String fileName) {
        String code = "utf-8";
        try{
            File file = new File(fileName);
            FileInputStream in = new FileInputStream(file);
            byte[] buf = new byte[4096];
            UniversalDetector detector = new UniversalDetector(null);
            int nread;
            while ((nread = in.read(buf)) > 0 && !detector.isDone()) {
                detector.handleData(buf, 0, nread);
            }
            detector.dataEnd();
            String encoding = detector.getDetectedCharset();
            if (StringUtils.isNotEmpty(encoding)) {
                code = encoding;
            }
            System.out.println(file.getName() + "的编码方式："+code);
        }catch (IOException e){
            e.printStackTrace();
        }
        return code;
    }
//    /**
//     * 获取文件的编码格式 法一
//     *   java中怎么获取、设置文件编码格式？
//     *   https://segmentfault.com/q/1010000012799434?sort=created
//     * @param fileName
//     * @return 出现异常返回 null，未知格式返回GBK
//     */
//    public static String getFileCharset(String fileName) {
//        BufferedInputStream bin = null;
//        String code = null;
//        try {
//            bin = new BufferedInputStream(new FileInputStream(fileName));
//            int p = (bin.read() << 8) + bin.read();
//            String h = Integer.toHexString(p).toUpperCase();
//            System.out.println("文件前两个字节对应的十进制："+p+"\t"+"十六进制："+h);
//            // 其中的 0xefbb、0xfffe、0xfeff、0x5c75这些都是这个文件的前面两个字节的16进制数
//            switch (p) {
//                case 0xefbb:
//                case 0xE380:
//                case 0xD0A:
//                    code = "UTF-8";
//                    break;
////                case 0x2D2D:  //java不支持
////                    code = "UTF-7";
////                    break;
//                case 0xfffe:
//                    code = "Unicode";
//                    break;
//                case 0xfeff:
//                    code = "UTF-16BE";
//                    break;
////                case 0x5c75:
////                    code = "ANSI|ASCII";//java不支持？
////                    break;
//                default:
//                    code = "GBK";
//            }
//            bin.close();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return code;
//    }

    /**
     * 读取28KB的内容到一个文件里
     */
    public static void writeSomeToFile(String fileName){
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        String fOut = "/home/platinum/文档/tmp.txt";
        System.out.println("输出目录：/home/platinum/文档/tmp.txt");
        try {
            bis = new BufferedInputStream(new FileInputStream(fileName));
            bos = new BufferedOutputStream(new FileOutputStream(fOut));
//            1024*28
            byte b[] = new byte[1024];
            for(int i=0;i<28;i++){
                bis.read(b);
                bos.write(b);
            }
            bos.flush();
            bos.close();
            bis.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
